package br.com.fogas.medicao.business;

import java.util.HashMap;
import java.util.Map;

import android.content.DialogInterface;
import android.content.Intent;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import br.com.fogas.database.entidade.Medidor;
import br.com.fogas.database.entidade.PlanoVisitas;
import br.com.fogas.medicao.R;
import br.com.fogas.medicao.activity.LeituraMedidorFragment;
import br.com.fogas.medicao.activity.helper.PlanoClientesHelper;
import br.com.fogas.medicao.application.ApplicationFogas;
import br.com.fogas.medicao.application.Constants;
import br.com.fogas.medicao.application.LoadFragment;
import br.com.fogas.medicao.exception.QRCodeException;
import br.com.fogas.utils.StringUtility;
import br.com.fogas.utils.dialog.DialogAlert;

import com.google.zxing.client.android.CaptureActivity;

public class LeituraQRCodeBusiness {

	public static final int REQUEST_CODE = 0;
	
	public static final String SCAN_RESULT = "SCAN_RESULT";
	
	public static final String SCAN_FORMAT = "SCAN_FORMAT";
	
	private Map<String, Integer> planoQRCODE;

	private PlanoClientesHelper helper;
	
	public LeituraQRCodeBusiness(PlanoClientesHelper helper) {
		this.helper = helper;
		this.planoQRCODE = new HashMap<String, Integer>();
	}
	
	public void onActivityResult(int requestCode, int resultCode, Intent data) {
		if(FragmentActivity.RESULT_OK == resultCode) {
			String scan_result = data.getStringExtra(SCAN_RESULT);
			String scan_format = data.getStringExtra(SCAN_FORMAT);
			String result = scan_format+";"+scan_result;
			qrCodeLidoSucesso(result);
		} else {
			qrCodeLidoErro();
		}
	}
	
	public void lerQRCODE() {
		String key = helper.getPlanoSelecionado().getCliente().getTx_cod_cliente();
		boolean tentouLerAntesPlano  = planoQRCODE.containsKey(key);
		
		if(tentouLerAntesPlano) {
			planoQRCODE.put(key, planoQRCODE.get(key) + 1);
		} else {
			planoQRCODE.put(key, 1);
		}
		
		Intent intent = new Intent(helper.getFragment().getActivity(), CaptureActivity.class);
		helper.getFragment().startActivityForResult(intent, REQUEST_CODE);
	}
	
	private void qrCodeLidoErro() {
		int numeroTentativas = ApplicationFogas.getInstance().getConfiguracao().getAppDados().getTentativas_leitura_qrcode();
		
		Integer leiturasPlano = planoQRCODE.get(helper.getPlanoSelecionado().getCliente().getTx_cod_cliente());
		
		boolean numeroTentativasLeituraQrCodeExcedido = leiturasPlano.equals(numeroTentativas);
		
		if(numeroTentativasLeituraQrCodeExcedido) {
			String message = helper.getFragment().getString(R.string.leitura_medidor_qrcode_atingido_numero_tentativas_leitura);
			message = StringUtility.replace(message, "#QTD#", numeroTentativas+" veze(s)");
			
			DialogAlert.newInstance()
			.setTitle(R.string.dialog_title_alert)
			.setCharMessage(message)
			.setPositiveClick(tentivasLeituraListener)
			.showDialog(helper.getFragment().getActivity().getSupportFragmentManager());
		}
	}
	
	DialogInterface.OnClickListener tentivasLeituraListener = new DialogInterface.OnClickListener() {

		@Override
		public void onClick(DialogInterface dialog, int which) {
			dialog.dismiss();
			direcionarLeituraMedidor(false, null);
		}
	};
	
	private void direcionarLeituraMedidor(boolean qrCodeLido, Medidor medidor) {
		Fragment fragment = LeituraMedidorFragment.newInstance(helper.getPlanoSelecionado(), qrCodeLido, medidor);
		LoadFragment loadFragment = new LoadFragment(helper.getFragment().getActivity().getSupportFragmentManager());
		loadFragment.initializeFragment(true, fragment, Constants.FRAGMENT_FATURAMENTO);
	}
	
	private Medidor buscarMedidor(String resultQRCODE, PlanoVisitas planoLocal) throws QRCodeException {
		String[] result = resultQRCODE.split(";");
		String tipoCodBarras = result[0];
		//String clienteQrCode = result[1];
		String medidorQRcode = result[2];
		
		if(!tipoCodBarras.equals("QR_CODE")) {
			throw new QRCodeException("CODIGO_BARRAS_DIFERENTE_QRCODE");
		}
		
		if(result.length < 3) {
			throw new QRCodeException("CONTEUDO_CODIGO_BARRAS_DIFERENTE_FOGAS");
		}
		
		for(Medidor medidor: planoLocal.getMedidores()) {
			if(medidor.getTx_cod_medidor() == medidorQRcode) 
				return medidor;
		}
		
		throw new QRCodeException("MEDIDOR_NAO_ENCONTRADO");
	}
	
	private void qrCodeLidoSucesso(String result) {
		try {
			Medidor medidor = buscarMedidor(result, helper.getPlanoSelecionado());
			direcionarLeituraMedidor(true, medidor);
		} catch (QRCodeException e) {
			String message = "";
			if(e.getMessage().equals("CODIGO_BARRAS_DIFERENTE_QRCODE")) {
				message = helper.getFragment().getString(R.string.leitura_medidor_nao_qrcode);
			}else if(e.getMessage().equals("CONTEUDO_CODIGO_BARRAS_DIFERENTE_FOGAS")) {
				message = helper.getFragment().getString(R.string.leitura_medidor_conteudo_inesperado);
			}else if(e.getMessage().equals("MEDIDOR_NAO_ENCONTRADO")) {
				message = helper.getFragment().getString(R.string.leitura_qrcode_medidor_nao_encontrado);
			}
			
			DialogAlert.newInstance()
			.setTitle(R.string.dialog_title_alert)
			.setCharMessage(message)
			.setPositiveClick(dialog1Listener)
			.showDialog(helper.getFragment().getActivity().getSupportFragmentManager());
		}
	}
	
	DialogInterface.OnClickListener dialog1Listener = new DialogInterface.OnClickListener() {

		@Override
		public void onClick(DialogInterface dialog, int arg1) {
			dialog.dismiss();
			DialogAlert.newInstance()
			.setTitle(R.string.dialog_title_alert)
			.setCharMessage(helper.getFragment().getString(R.string.leitura_medidor_qrcode_leitura_error_ocorrido))
			.setPositiveClick(new DialogInterface.OnClickListener() {

				@Override
				public void onClick(DialogInterface dialog, int which) {
					direcionarLeituraMedidor(false, null);
				}
				
			}).showDialog(helper.getFragment().getActivity().getSupportFragmentManager());
		}
		
	};
}
